#!/usr/bin/python3
#-*- coding: UTF-8 -*-
"""
列表推导式:
    为什么使用列表推导式:
        列表推导式提供了一个更简单的创建列表的方法
    使用场景:
        常见的用法是把某种操作应用于序列或可迭代对象的每个元素上，然后使用其结果来创建列表，或者通过满足某些特定条件元素来创建子序列；
    推导式结构:
        [表达式 for子句 零个或多个for或if子句]
        列表推导式的结构是由一对方括号包含的以下内容: 一个表达式，后面跟一个 for 子句，然后是零个或多个for或if子句

"""
squares = []
for x in range(10):
    squares.append(x**2)
#print(x)
print(squares)
"""
注意：
    上面for循环结束后 x 变量在for循环后仍然存在。我们可以计算平方列表的值而不会产生任何副作用
"""
squares1 = list(map(lambda x: x**2, range(10)))
#print(x)
print(squares1)
squares2 = [x**2 for x in range(10)]
print(x)
print(squares2)


squares3 = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(squares3)

squares4 = []
for x in [1,2,3]:
    for y in [3,1,4]:
        if x != y:
            squares4.append((x, y))
print(squares4)

from math import pi
a = [str(round(pi, i)) for i in range(1, 6)]
print(a)


"""
嵌套的列表推导式:
    列表推导式中的初始表达式可以是任何表达式，包括另一个列表推导式，一个列表推导式包含其它列表推导式的方式叫做嵌套的列表推导式。    
"""
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]
print(matrix)
# 使用推导式将 matrix 矩阵行列互换
matrix_reverse = [[row[i] for row in matrix] for i in range(4)]
print(matrix_reverse)

transposed = []
for i in range(4):
    transposed.append([row[i] for row in matrix])
print(transposed)

transposed = []
for i in range(4):
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)
print(transposed)

a = list(zip(*matrix))
print(a)

